package com.fhyc.common;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fhyc.util.BeanConvertUtil;


import java.util.Arrays;
import java.util.List;

/**
 * 重新定义分页返回结果，隐藏不需要的字段，统一分页结果的字段名称。
 *
 * @author 陈华杰
 * @date 2024-04-22
 */
@JsonIgnoreProperties({"current", "optimizeCountSql", "orders", "records", "size", "total", "pages", "searchCount", "countId", "maxLimit"})
//分页结果
public class XPage<T> extends Page<T> {

    public XPage() {
        super();
    }

    /**
     * @param curPage  当前页
     * @param pageSize 每页显示条数
     */
    public XPage(long curPage, long pageSize) {
        super(curPage, pageSize, 0L);
    }

    /**
     * @param curPage  当前页
     * @param pageSize 每页显示条数
     * @param order    排序方式
     */
    public XPage(long curPage, long pageSize, String order) {
        this(curPage, pageSize);
        this.setOrder(order);
    }

    public XPage(PageParam param) {
        this(param.getPageNum(), param.getPageSize());
        this.setOrder(param.getOrder());
    }

    //记录列表
    public List<T> getData() {
        return this.records;
    }

    //当前页
    public long getCurPage() {
        return this.current;
    }

    //每页显示条数
    public long getPageSize() {
        return this.size;
    }

    //总数
    public long getTotalCount() {
        return this.total;
    }

    //总页数
    public long getTotalPage() {
        return this.getPages();
    }

    //排序字段   example = "id desc, name asc"
    public void setOrder(String order) {
        if (StringUtils.isEmpty(order)) {
            return;
        }
        Arrays.stream(order.split(",")).forEach(item -> {
            // 拆分字段名和排序方式
            item = item.trim();
            if (StringUtils.isEmpty(item)) {
                return;
            }
            String[] orderParts = item.split(" ");

            if (orderParts.length > 0) {
                // 驼峰转蛇形，数据库中字段统一采用蛇形命名形式
                String fieldName = StringUtils.camelToUnderline(orderParts[0]);
                OrderItem orderItem;

                // 排序方式解析成 OrderItem
                if (orderParts.length == 2 && "desc".equalsIgnoreCase(orderParts[1])) {
                    orderItem = OrderItem.desc(fieldName);
                } else {
                    orderItem = OrderItem.asc(fieldName);
                }
                this.addOrder(orderItem);
            }
        });
    }

    /**
     * 将分页数据的数据转换为目标对象类型
     *
     * @param sourceXPage 源分页数据
     * @param targetClass 目标对象类型
     * @param <T>         源分页数据类型
     * @param <R>         目标对象类型
     * @return 目标对象类型的分页数据
     */
    public static <T, R> XPage<R> convertPage(XPage<T> sourceXPage, Class<R> targetClass) {
        if (sourceXPage == null) {
            return null;
        }
        XPage<R> targetXPage = new XPage<>(sourceXPage.getCurPage(), sourceXPage.getPageSize());
        targetXPage.setRecords(BeanConvertUtil.converList(sourceXPage.getRecords(), targetClass));
        targetXPage.setTotal(sourceXPage.getTotal());
        return targetXPage;
    }
}
